iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0
Mobile Development

30天用React native製作app!!系列 第 25

[蚊子的Day25]淡入動畫~React Native

  • 分享至 

  • xImage
  •  

React Native支援View、Text、Image、ScrollView、FlatList、SectionList等標籤設定動畫,其他元件也可使用Animated.createAnimatedComponent()設定。

我這次要使用的淡入動畫需要用到Animated View,所以要先新增一個fadeAnim.js檔後載入animated API:

import {Animated } from 'react-native';

之後要設定動畫的初始值:

const fadeAnim = new Animated.Value(0); 

可是這樣設定會有個問題就是每次畫面重新渲染的時候,動畫變數fadeAnim都會歸零,這時就需要參考變數useRef了。

參考變數useRef

React Native其實提供了兩種方法儲存變數

  • 狀態變數useState:只要App沒有完全關閉,useState記錄的狀態就不會消失,且狀態變數一旦改變會啟動重新渲染
  • 參考變數useRef:只要App沒有完全關閉,useRef記錄的參考變數就不會消失(類似於全域變數的效果)

useRef是React Native提供的Hook,用來記錄App的變數,使用時要先將useRef匯入。

import React, {useEffect} from "react";

然後將fadeAnim改成用useRef宣告,參考變數在使用時,要在後面加入.current:

const fadeAnim = useRef(new Animated.Value(0)).current; 

接下來在useEffect內利用Animated.timing函式設定變數fadeAnim用十秒從0變成1
(toValue為要變成的值、duration為要花的時間(毫秒))

useEffect(() => {
  Animated.timing(fadeAnim, {
     toValue: 1,
     duration: 1000,
  }).start();
}, []);

最後利用<Animated.View>宣告一個自訂標籤,之後就可以在其他畫面檔案裡使用此自訂標籤了。

import React, {useRef,useEffect} from "react";
import {Animated } from 'react-native';
const FadeInView = (props) => {
    const fadeAnim = useRef(new Animated.Value(0)).current; 
    // const fadeAnim = new Animated.Value(0); 
    useEffect(() => {
      Animated.timing(fadeAnim, {
        toValue: 1,
        duration: 1000,
      }).start();
    }, []);
  
    return (
      <Animated.View
        style={{
          ...props.style,
          opacity: fadeAnim,
        }}
      >
        {props.children}
      </Animated.View>
    );
  };

  export default FadeInView;

自訂動畫標籤用法:

import FadeInView from "../animation/fadeAnim"

const HomeScreen = ({ navigation }) => {
  return (
      <FadeInView>
          <Text>這裡是首頁</Text>
      </FadeInView>
  );
}

上一篇
[蚊子的Day24]利用記錄上次關閉頁面功能做一個「擬似」登入頁面~React Native
下一篇
[蚊子的Day26]排行榜的製作-Firebase的使用~React Native
系列文
30天用React native製作app!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言